iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 28
0
Software Development

30天快速上手Laravel系列 第 28

Day 28-[DB 操作] Eloquent ORM 取回資料

  • 分享至 

  • xImage
  •  

介紹

Eloquent ORM 提供了簡潔的實作和資料庫互動,每個table都有一個對應的 "Model" 可以跟table互動,在做完前面DB的設定以後[Entity / DB簡介],就可以使用。

用法

可以把Eloquent Model想像成一個更方便的Query Builder,所以任何query builder可以操作的方法它都可以使用

取回model

<?php

//取回全部資料
$flights = App\Flight::all();

foreach ($flights as $flight) {
    echo $flight->name;
}
//下條件取回資料
$flights = App\Flight::where('active', 1)
               ->orderBy('name', 'desc')
               ->take(10)
               ->get();

在比較新的版本中有提供 freshrefresh方法可以使用

  • fresh data 取得的資料不影響已被取出的model instance。
  • refresh 會重新用db的fresh data取得資料,並直接影響原本的model instance,相關的relation也會被影響。
//fresh
$flight = App\Flight::where('number', 'FR 900')->first();
$freshFlight = $flight->fresh();

//refresh
$flight = App\Flight::where('number', 'FR 900')->first();
$flight->number = 'FR 456';
$flight->refresh();
$flight->number; // "FR 900"

取得單一model

// 用primary key取回model
$flight = App\Flight::find(1);

// 取回第一個符合條件的model
$flight = App\Flight::where('active', 1)->first();

find 還可以使用array,例如: find([1, 2, 3]);

沒有資料時回傳Exception

$model = App\Flight::findOrFail(1);

$model = App\Flight::where('legs', '>', 100)->firstOrFail();

會回傳404 HTTP response

Collections

laravel 提供了很多collection的方法可以使用,舉幾個常用的例子

map

遍歷整個集合並將每一個數值傳入給定的回呼函式。回呼函式可以任意修改並回傳項目,於是形成修改過的項目組成的新集合

$data = $products->map(function ($product) use ($inventories) {
    return [
        'id' => $product->id,
        'name' => $product->name,
        'inventory' => $inventories[$product->id],
        'created_at' => Carbon::parse($product->created_at)->toDateTimeString(),
        'updated_at' => Carbon::parse($product->updated_at)->toDateTimeString(),
    ];
});

當然,這些也可以用foreach達到一樣的效果

foreach ($products as $product) {
    $data[] = [
        'id' => $product->id,
        'name' => $product->name,
        'inventory' => $inventories[$product->id],
        'created_at' => Carbon::parse($product->created_at)->toDateTimeString(),
        'updated_at' => Carbon::parse($product->updated_at)->toDateTimeString(),
    ];
}

map 並不會修改原本的集合,而是生成一個 "新的" 集合,因此如果想改動原本的集合需要用 transform

keyBy

會用指定的key把結果做分類

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'desk'],
    ['product_id' => 'prod-200', 'name' => 'chair'],
]);

$keyed = $collection->keyBy('product_id');

$keyed->all();

出來的結果

[
    'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
    'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]

其他有很多跟query builder很像的操作,如果有興趣的話可以去官網看看。


上一篇
Day27-[DB 操作] Query Builder More
下一篇
Day29-[DB 操作] Eloquent ORM 基本操作
系列文
30天快速上手Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言